﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PraxisRent.Entities;
using System.Data;

namespace PraxisRent.Repository
{
    public class DetalleAlquilerRepository:MasterRepository,IDetalleAlquilerRepository
    {
        public List<DETALLE_ALQUILER> GetAllFromDetalleAlquilerByAlquilerId(int id)
        {
            var query = from c in context.DETALLE_ALQUILER.Include("EQUIPO.MARCA").Include("ALQUILER")
                        where c.CodigoAlquiler.Equals(id)
                        select c;
            return query.ToList();
        }


        public List<DETALLE_ALQUILER> GetAllFromDetalleAlquiler()
        {
            var query = from c in context.DETALLE_ALQUILER
                        select c;
            return query.ToList();
        }

        public List<DETALLE_ALQUILER> GetAllFromDetalleAlquilerByEquipo(string criterio)
        {
            var query = from c in context.DETALLE_ALQUILER.Include("EQUIPO")
                        select c;
            if (criterio != null && criterio != string.Empty && criterio != "")
            {
                query = from c in context.DETALLE_ALQUILER.Include("EQUIPO")
                        where c.EQUIPO.Nombre.ToUpper().Contains(criterio)
                        select c;
            }
            return query.ToList();
        }

        public void updateDetalleAlquilerByEntregado(ENTREGA entrega)
        {
            var detAlquilerDB = (from c in context.DETALLE_ALQUILER.Include("EQUIPO")
                                 where c.CodigoAlquiler.Equals(entrega.CodigoAlquiler)
                                 select c).ToList();

            List<DETALLE_ALQUILER> listaElemntsEntregadosDB = new List<DETALLE_ALQUILER>();

            //verificamos los equipos que tienen en comun para editar el estado de ENTREGA
            foreach (var item in detAlquilerDB)
            {
                var existe = entrega.DETALLE_ENTREGA.Where(p => p.CodigoEquipo.Equals(item.CodigoEquipo)).SingleOrDefault();
                if (existe != null)
                {
                    listaElemntsEntregadosDB.Add(item);
                }
            }

            //editamos los equipos encontrados para su ENTREGA
            foreach (var item in listaElemntsEntregadosDB)
            {
                item.ALQUILER = null;
                item.EQUIPO = null;
                item.Entregado = true;
                context.Entry(item).State = EntityState.Modified;
            }

            context.SaveChanges();
        }


        public void updateDetalleAlquilerByDevuelto(DEVOLUCION devolucion)
        {
            var detAlquilerDB = (from c in context.DETALLE_ALQUILER.Include("EQUIPO")
                                 where c.CodigoAlquiler.Equals(devolucion.CodigoAlquiler)
                                 select c).ToList();

            List<DETALLE_ALQUILER> listaElemntsDevueltosDB = new List<DETALLE_ALQUILER>();

            //verificamos los equipos que tienen en comun para editar el estado de DEVOLUCION
            foreach (var item in detAlquilerDB)
            {
                var existe = devolucion.DETALLE_DEVOLUCION.Where(p => p.CodigoEquipo.Equals(item.CodigoEquipo)).SingleOrDefault();
                if (existe != null)
                {
                    listaElemntsDevueltosDB.Add(item);
                }
            }

            //editamos los equipos encontrados para su ENTREGA
            foreach (var item in listaElemntsDevueltosDB)
            {
                item.ALQUILER = null;
                item.EQUIPO = null;
                item.Devuelto = true;
                context.Entry(item).State = EntityState.Modified;
            }

            context.SaveChanges();
        }
    }
}
